/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.invoice.model.dao;

import com.invoice.busines.dto.ArticulosInventarioDTO;
import com.invoice.busines.dto.InventarioCampoDTO;
import com.invoice.busines.dto.InventarioCampoDTO;
import com.invoice.busines.dto.InventarioDTO;
import com.invoice.exceptions.InvoiceException;
import com.invoice.model.entities.Articulosinventario;
import com.invoice.model.entities.Inventario;
import com.invoice.model.entities.InventarioCampo;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;

/**
 *
 * @author laura
 */
public class InventarioDAOHibernate  extends DAOGenerico implements InventarioDAO{
    ArticuloDAOHibernate articuloDAO = new ArticuloDAOHibernate();
    VendedorDAOHibernate vendedorDAO = new VendedorDAOHibernate();
    @Override
    public Inventario convertDTOtoPojo(Object object) {
        InventarioDTO inventarioDTO = (InventarioDTO)object;
        Inventario inventario = new Inventario();
        inventario.setFecha(inventarioDTO.getFecha());
        inventario.setIdInventario(inventarioDTO.getIdInventario());
        if(inventarioDTO.getVendedorDTO() != null &&inventarioDTO.getVendedorDTO().getNombre()!=null && !inventarioDTO.getVendedorDTO().getNombre().isEmpty()){
            inventario.setVendedor(vendedorDAO.convertDTOtoPojo(inventarioDTO.getVendedorDTO()));
        }
        inventario.setNomLugar(inventarioDTO.getNomLugar());
        inventario.setNumGuia(inventarioDTO.getNumGuia());
        inventario.setNumFactura(inventarioDTO.getNumFactura());
        inventario.setEstado(inventarioDTO.getEstado());
        if(inventarioDTO.getArticulosInventario() != null){
            Articulosinventario articulosinventario;
            for (ArticulosInventarioDTO articulosInventarioDTO : inventarioDTO.getArticulosInventario()) {
                articulosinventario = new Articulosinventario();
                articulosinventario.setArticulos(articuloDAO.convertDTOtoPojo(articulosInventarioDTO.getArticuloDTO()));
                articulosinventario.setIdArticuloInventario(articulosInventarioDTO.getIdArticuloInventario());
                articulosinventario.setCantidad(articulosInventarioDTO.getCantidad());
                articulosinventario.setPco(articulosInventarioDTO.getPco());
                articulosinventario.setInventario(inventario);
                inventario.addArticuloinventario(articulosinventario);
            }        
        }
        if(inventarioDTO.getInventarioCampoDTOs() != null){
            InventarioCampo inventarioCampo;
            for (InventarioCampoDTO inventarioCampoDTO : inventarioDTO.getInventarioCampoDTOs()){
                inventarioCampo = new InventarioCampo();
                inventarioCampo.setIdInventarioCampo(inventarioCampoDTO.getIdInventarioCampo());
                inventarioCampo.setNameLabel(inventarioCampoDTO.getNameLabel());
                inventarioCampo.setValueLabel(inventarioCampoDTO.getValueLabel());
                inventario.addInventarioCampo(inventarioCampo);
            }
        }
        return inventario;
    }

    @Override
    public InventarioDTO convertPojotoDTO(Object object) {
        Inventario inventario = (Inventario)object;
        InventarioDTO inventarioDTO = new InventarioDTO();
        inventarioDTO.setFecha(inventario.getFecha());
        inventarioDTO.setIdInventario(inventario.getIdInventario());
        inventarioDTO.setVendedorDTO(vendedorDAO.convertPojotoDTO(inventario.getVendedor()));
        inventarioDTO.setNomLugar(inventario.getNomLugar());
        inventarioDTO.setNumGuia(inventario.getNumGuia());
        inventarioDTO.setNumFactura(inventario.getNumFactura());
        inventarioDTO.setEstado(inventario.getEstado());
        if(inventario.getArticulosinventario() != null){
            ArticulosInventarioDTO articulosInventarioDTO;
            for (Articulosinventario articulosinventario : inventario.getArticulosinventario()) {
                articulosInventarioDTO = new ArticulosInventarioDTO();
                articulosInventarioDTO.setArticuloDTO(articuloDAO.convertPojotoDTO(articulosinventario.getArticulos()));
                articulosInventarioDTO.setIdArticuloInventario(articulosinventario.getIdArticuloInventario());
                articulosInventarioDTO.setCantidad(articulosinventario.getCantidad());
                articulosInventarioDTO.setPco(articulosinventario.getPco());
                inventarioDTO.addArticuloInventario(articulosInventarioDTO);
            }
        }
        if(inventario.getInventarioCampos() != null){
            InventarioCampoDTO inventarioCampoDTO;
            for (InventarioCampo inventarioCampo : inventario.getInventarioCampos()){
                inventarioCampoDTO = new InventarioCampoDTO();
                inventarioCampoDTO.setIdInventarioCampo(inventarioCampo.getIdInventarioCampo());
                inventarioCampoDTO.setNameLabel(inventarioCampo.getNameLabel());
                inventarioCampoDTO.setValueLabel(inventarioCampo.getValueLabel());
                inventarioDTO.addInventarioCampoDTO(inventarioCampoDTO);
            }
        }
        return inventarioDTO;
    }

    @Override
    public List<InventarioDTO> findAll() throws InvoiceException {
        List<InventarioDTO> result = new ArrayList<InventarioDTO>();
        try{
            startSession();
            Query query=session.createQuery("from Inventario");
            List<Inventario> list=query.list();
            for (Inventario inventario : list) {
                InventarioDTO inventarioDTO=convertPojotoDTO(inventario);
                result.add(inventarioDTO);
            }            
            transaction.commit();
            return result;
        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        }finally{
            closeSession();
        }
    }

    @Override
    public List<InventarioDTO> findByModalidad(Character modalidad) throws InvoiceException {
        List<InventarioDTO> result = new ArrayList<InventarioDTO>();
        try{
            startSession();
            Query query=session.createQuery("from Inventario where modalidad=:modalidad").setParameter("modalidad", modalidad);
            List<Inventario> list=query.list();
            for (Inventario inventario : list) {
                InventarioDTO inventarioDTO=convertPojotoDTO(inventario);
                result.add(inventarioDTO);
            }            
            transaction.commit();
            return result;
        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        }finally{
            closeSession();
        }
    }

    
    @Override
    public InventarioDTO findById(Integer idInventario) throws InvoiceException {
        try {
            startSession();
            Query query=session.createQuery("from Inventario where idInventario=:idInventario").setParameter("idInventario", idInventario);
            Inventario inventario=(Inventario)query.uniqueResult();
            InventarioDTO inventarioDTO=convertPojotoDTO(inventario);
            transaction.commit();
            return inventarioDTO;
        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        }finally{
            closeSession();
        }
    }
}